package 框架学习.MyBatis.增删改查;

public class index {
    public static void main(String[] args) {
        //增删改查操作详见项目springboot-mybatis-basic-operations

        //打开Mybatis的日志
        //要在配置文件中打开（详见文件）
        /*
        ==>  Preparing: delete from emp where id = ?;
        ==> Parameters: 4(Integer)
        <==    Updates: 1
        */
        //上述日志内容，称为预编译SQL
        //执行时，会将Preparing和Parameters一起发送给数据库，而不是拼接好再发送

        //预编译SQL语句的优势：
        //1、性能更高：
        //Java项目中的SQL语句执行是有一个过程的
        //首先Java项目要先与数据库连接
        //然后将SQL语句发送给数据库
        //而数据库在接收到数据后，要先进行一系列操作
        //比如SQL语法解析检查、优化SQL、编译SQL
        //然后再执行SQL
        //而数据库把解析检查、优化、编译操作后的SQL缓存起来
        //所谓缓存就是一块储存区域
        //当再次执行SQL时
        //就会先看缓存中是否有编译好的SQL
        //如果有就省去了前面的一系列操作，直接执行

        //非预编译的SQL执行：
        //多条条件不同的SQL语句先后发送给数据库（
        //如：
        // delete from emp where id = 1;
        // delete from emp where id = 2;
        // delete from emp where id = 3;
        // ）
        //虽然都会被缓存，但是每条语句都不一样
        //所以操作不能免去

        //预编译SQL的执行：
        //发送给数据库的SQL是：delete from emp where id = ?;
        //数据库会把同时发送给它的参数替换?
        //仅仅id值不同，数据库只用执行一次前面的操作


        //2、更安全（防止SQL注入）
        //SQL注入：SQL注入是通过操作输入的数据来修改事先定义好的SOL语句，以达到执行代码对服务器进行攻击的方法

        //Mybatis的两个占位符：
        //1、#{}
        //执行SQL时，将#{}替换成?，会自动设置参数值
        //参数传递都使用#{}

        //2、${}
        //拼接SQL，将参数直接拼接在SQL语句中，存在SQL注入问题
        //使用场景：对表名、字段名进行动态设置时使用


        //数据封装
        //实体类属性名和数据库表查询返回的字段名一致，mybatis会自动封装
        //如果实体类属性名和 数据库表查询返回的字段名不一致，不能自动封装
        //由于数据库表中字段命名是下划线。而Java中属性命名是驼峰法，有的字段就不能被封装
        //解决方案一：查询时给查询的字段起别名，让别名与实体类属性一致
        //解决方案二：使用@Results和@Result进行手动映射
        //解决方案三：开启Mybatis驼峰命名自动映射的开关（最优）




    }
}
